#include "ManejadorCandidato.h"
#include "../Entidades/Utils.h"

using namespace Manejadores;

ManejadorCandidato::ManejadorCandidato() {
	Configuracion* config = Configuracion::getInstancia();
	string pathDeDatos = config->getNombreArchivoCandidato();
	this->candidatos = new ArchivoDeEstructurasVariables(pathDeDatos);
	this->indicePorUnicidad = new HashExtensible("IndicePorUnicidadCandidato");
	this->indicePorLista = new ArbolBMas("PorLista");
}

bool ManejadorCandidato::alta(Candidato* candidato){

	string claveUnicidad = candidato->getLista()->getNombre();
	if (!indicePorUnicidad->existe(claveUnicidad)) {
		unsigned int posicionDelRegistro = candidatos->insertar(candidato);
		indicePorUnicidad->insertar(claveUnicidad, posicionDelRegistro);
		string claveFecha = Utils::convertirEnteroAString(candidato->getLista()->getEleccion()->getFecha());
		string claveCargo = candidato->getCargo()->getNombre();
		string claveNombre = candidato->getVotante()->getNombreYApellido();
		string clavePorLista = claveFecha+claveCargo+claveNombre;
		indicePorLista->insertar(clavePorLista, posicionDelRegistro);
		return true;
	} else
		return false;
}

bool ManejadorCandidato::baja(Candidato* candidato){
	string claveUnicidad = candidato->getLista()->getNombre();
	IRegistroIndice* aBorrar = indicePorUnicidad->buscar(claveUnicidad);
	if (aBorrar->getOffsets()->size() > 0) {
		candidatos->borrar(candidato, aBorrar->getOffsets()->at(0));
		indicePorUnicidad->eliminar(claveUnicidad, aBorrar->getOffsets()->at(0));
		string claveFecha = Utils::convertirEnteroAString(candidato->getLista()->getEleccion()->getFecha());
		string claveCargo = candidato->getCargo()->getNombre();
		string claveNombre = candidato->getVotante()->getNombreYApellido();
		string clavePorLista = claveFecha+claveCargo+claveNombre;
		indicePorLista->suprimir(clavePorLista, aBorrar->getOffsets()->at(0));
		delete aBorrar;
		return true;
	} else
		return false;

}

bool ManejadorCandidato::modificacion(Candidato* candidato){

	string claveUnicidad = candidato->getLista()->getNombre();
	IRegistroIndice* viejaPosicion = indicePorUnicidad->buscar(claveUnicidad);
	unsigned int nuevaPosicion = candidatos->modificar(candidato, viejaPosicion->getOffsets()->at(0));
	if (viejaPosicion->getOffsets()->at(0) != nuevaPosicion){
		indicePorUnicidad->modificar(claveUnicidad, viejaPosicion->getOffsets()->at(0),nuevaPosicion);
		string claveFecha = Utils::convertirEnteroAString(candidato->getLista()->getEleccion()->getFecha());
		string claveCargo = candidato->getCargo()->getNombre();
		string claveNombre = candidato->getVotante()->getNombreYApellido();
		string clavePorLista = claveFecha + claveCargo + claveNombre;
		indicePorLista->modificar(clavePorLista, viejaPosicion->getOffsets()->at(0), nuevaPosicion);
		return true;
	}else
		return false;
}

ManejadorCandidato::~ManejadorCandidato() {
	delete this->candidatos;
	delete this->indicePorUnicidad;
	delete this->indicePorLista;
}
